[HTTP] HTTP의 안전, 멱등, 캐시가능 속성

업데이트:



✅ HTTP 메서드의 속성

HTTP 메서드인 GET / POST / PUT / PATCH / DELETE 는 메서드의 동작 과정 뿐만 아니라, 각 메서드가 가지고 있는 속성을 반드시 알 필요가 있습니다. 왜냐하면 어떤 HTTP 메서드로 서버에 요청했느냐에 따라 API 설계나 복구 메커니즘 캐시 최적화 등 설계 로직이 달라질 수 있기 때문입니다.

HTTP 메서드의 속성은 크게 안전( Safe ), 멱등( Idempotent ), 캐시 가능( Cacheable ) 로 3가지가 존재합니다. 3가지 속성에 대한 이해와 각 메서드 별 어떤 속성을 지니고 있는지 알아보도록 하겠습니다.







✅ 안정성 ( Safe )

HTTP 메서드의 안정성이란 보안 취약점에 대한 안정을 말하는게 아니라, 호출해도 리소스가 변경되지 않는 성질, 즉 리소스 유지에 대한 안정성을 의미합니다.

GET 메서드는 리소스를 조회하는 기능을 수행하기 때문에, 리소스에 대한 변경 및 수정이 전혀 이루어지지 않으므로, 안정성을 띄는 HTTP 메서드라고 볼 수 있습니다.

그러나 POST, PUT, PATCH, DELETE 같은 메서드는 리소스에 대한 처리, 수정, 삭제를 수행하기 때문에 안정성을 띄지 않는 HTTP 메서드 입니다.

여기서 GET 메서드가 엄청나게 많은 양의 호출을 통해 서버가 터지거나, 로그가 쌓여 장애가 발생하는 상황이 발생할지라도, HTTP 메서드의 속성에서 정의하는 안정성, 즉 리소스가 변경되지 않는 성질은 변하지 않기 때문에 리소스의 유지에 있어서는 안전하다고 볼 수 있다.

한마디로 안정성은 시스템 장애와는 별개로 리소스 유지에만 집중한다는 뜻이다.







✅ 멱등 ( Idempotent )

멱등이란, 수학이나 전산학에서 연산을 여러 번 적용하더라도 결과가 달라지지 않는 성질을 의미합니다.

이를 HTTP의 멱등성에 대입해보면, 요청을 한번 호출하든 여러번 호출하든 결과가 항상 동일함을 의미합니다. 즉, 동일한 요청을 한번 보내는 것과 여러번 연속으로 보내는 것이 같은 결과를 가져오고, 서버의 상태도 동일할 때 해당 HTTP 메서드가 멱등성을 가진다고 말합니다.

여기서 안정과 멱등을 혼동하기 쉬운데,

  • 안전은 한번 호출하든 여러번 호출하든 리소스 수정 X
  • 멱등은 한번 호출하든 여러번 호출하든 수정이 발생할 지라도 실행 결과가 계속 같음

여기서 멱등은 동일한 결과 + 동일한 서버 상태가 유지 되어야 함을 유의해야 한다. 예를 들어 응답 상태코드가 다르다 할지라도, 서버의 상태가 같다면 멱등성이 있다고 판단하는 것 입니다.



좀 더 쉬운 이해를 위해 예시로 알아보도록 하겠습니다.

GET /pageX HTTP/1.1 은 멱등성을 가집니다. 여러번 연속해서 호출해도 클라이언트가 받는 응답은 동일합니다.

 GET /pageX HTTP/1.1
 
 GET /pageX HTTP/1.1
 
 GET /pageX HTTP/1.1
 
 GET /pageX HTTP/1.1


POST /add_row HTTP/1.1는 멱등성을 갖지 않습니다. 여러 번 호출할 경우, 여러 열을 추가합니다.

POST /add_row HTTP/1.1
POST /add_row HTTP/1.1   -> Adds a 2nd row
POST /add_row HTTP/1.1   -> Adds a 3rd row


DELETE /idX/delete HTTP/1.1의 상태 코드는 응답마다 달라질 수 있지만, 그럼에도 멱등성을 가집니다. 이 예시를 통해 응답 상태코드는 다르지만, 서버의 상태는 같으므로 멱등성을 가진다는 것을 알 수 있습니다.

DELETE /idX/delete HTTP/1.1   -> Returns 200 if idX exists
DELETE /idX/delete HTTP/1.1   -> Returns 404 as it just got deleted
DELETE /idX/delete HTTP/1.1   -> Returns 404







✅ 캐시 가능 ( Cacheable )

캐시 가능 속성은 응답 결과 리소스를 캐시해서 사용해도 되는가를 의미합니다.

브라우저도 캐시를 가지고 있는데, 클라이언트가 서버에 요청한 데이터에 대해 캐시를 보관하는게 가능합니다.

즉, 캐싱이 가능한 HTTP 메소드는 빠르게 캐시 데이터를 가져와 결과값을 가질 수 있습니다.

일반적으로 GET, POST, PATCH, HEAD 메서드가 캐시가능 속성을 지니지만 실제로는 GET, HEAD만 캐시로 사용합니다.

댓글남기기